home *** CD-ROM | disk | FTP | other *** search
- // Image.cpp: implementation of the Image class.
- //
- //////////////////////////////////////////////////////////////////////
-
- #include "stdafx.h"
- //#include "HTBImage.h"
- #include "Image.h"
- #include "export.h"
- //#include "winuser.h"
-
- #ifdef _DEBUG
- #undef THIS_FILE
- static char THIS_FILE[]=__FILE__;
- #define new DEBUG_NEW
- #endif
-
- //////////////////////////////////////////////////////////////////////
- // Construction/Destruction
- //////////////////////////////////////////////////////////////////////
- short Image::sm_NextImageID = 1;
-
- Image::Image()
- {
- // m_ImageFilename.Empty();
- m_Region = NULL;
- m_Signal = 0;
- m_Xpos = 0;
- m_Ypos = 0;
- m_ImageID = sm_NextImageID++;
- m_pNextImage = NULL;
- m_hBitmap = NULL;
- m_bShow = FALSE;
- m_bAllowDrag = FALSE;
- m_bDragging = FALSE;
-
- }
-
- Image::~Image()
- {
- if (m_pNextImage)
- {
- delete m_pNextImage;
- }
-
- }
-
- Image * Image::AddImage()
- {
- Image * pCurrent = this;
-
- while (pCurrent->m_pNextImage != NULL)
- {
- pCurrent = pCurrent->m_pNextImage;
- }
-
- pCurrent->m_pNextImage = new Image;
-
- return(pCurrent->m_pNextImage);
- }
-
- BOOL Image::LoadImage(char * ImageFilename)
- {
- //m_ImageFilename = ImageFilename;
- strcpy(m_ImageFilename,ImageFilename);
-
- m_hBitmap = ::LoadImage(NULL,m_ImageFilename,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
-
- if (m_hBitmap == NULL)
- {
- return(FALSE);
- }
-
- // Get the color depth of the DIBSection
- GetObject(m_hBitmap, sizeof(BITMAP), &m_bm );
- // If the DIBSection is 256 color or less, it has a color table
- if ((m_bm.bmBitsPixel * m_bm.bmPlanes ) <= 8)
- {
- HDC hMemDC;
- HANDLE hOldBitmap;
- RGBQUAD rgb[256];
- LPLOGPALETTE pLogPal;
- WORD i;
-
- // Create a memory DC and select the DIBSection into it
- hMemDC = CreateCompatibleDC( NULL );
- hOldBitmap = SelectObject( hMemDC, m_hBitmap );
- // Get the DIBSection's color table
- GetDIBColorTable( hMemDC, 0, 256, rgb );
- // Create a palette from the color table
- pLogPal = (tagLOGPALETTE *)malloc( sizeof(LOGPALETTE) + (256*sizeof(PALETTEENTRY)) );
- pLogPal->palVersion = 0x300;
- pLogPal->palNumEntries = 256;
- for(i=0;i<256;i++)
- {
- pLogPal->palPalEntry[i].peRed = rgb[i].rgbRed;
- pLogPal->palPalEntry[i].peGreen = rgb[i].rgbGreen;
- pLogPal->palPalEntry[i].peBlue = rgb[i].rgbBlue;
- pLogPal->palPalEntry[i].peFlags = 0;
- }
- m_hPalette = CreatePalette( pLogPal );
- // Clean up
- free( pLogPal );
- SelectObject( hMemDC, hOldBitmap );
- DeleteDC( hMemDC );
- }
- else // It has no color table, so use a halftone palette
- {
- HDC hRefDC;
-
- hRefDC = GetDC( NULL );
- m_hPalette = CreateHalftonePalette( hRefDC );
- ReleaseDC( NULL, hRefDC );
- }
-
- return TRUE;
-
- }
-
- short Image::GetID()
- {
- return(m_ImageID);
- }
-
- void Image::Show(short ID,short Xpos, short Ypos, DWORD RasterOp)
- {
- Image * pCurrent = this;
-
- while (pCurrent->m_ImageID != ID && pCurrent->m_pNextImage != NULL)
- {
- pCurrent = pCurrent->m_pNextImage;
- }
-
- if (pCurrent->m_ImageID == ID)
- {
- pCurrent->m_Xpos = Xpos;
- pCurrent->m_Ypos = Ypos;
- pCurrent->m_RasterOp = RasterOp;
- pCurrent->m_bShow = TRUE;
- }
-
- }
-
- void Image::NoShow(short ID)
- {
- Image * pCurrent = this;
-
- while (pCurrent->m_ImageID != ID && pCurrent->m_pNextImage != NULL)
- {
- pCurrent = pCurrent->m_pNextImage;
- }
-
- if (pCurrent->m_ImageID == ID)
- {
- pCurrent->m_bShow = FALSE;
- }
- }
-
- void Image::Draw(HDC hDC)
- {
- Image * pCurrent = this;
-
-
- while (pCurrent)
- {
- if (pCurrent->m_bShow)
- {
- HBITMAP hOldBitmap;
- HDC hMemDC = CreateCompatibleDC(NULL);
-
- SelectPalette(hMemDC,pCurrent->m_hPalette,FALSE);
- RealizePalette(hMemDC);
- hOldBitmap = (HBITMAP)SelectObject(hMemDC,(HBITMAP)pCurrent->m_hBitmap);
-
-
- BitBlt(hDC,pCurrent->m_Xpos,pCurrent->m_Ypos,pCurrent->m_bm.bmWidth,pCurrent->m_bm.bmHeight,hMemDC,0,0,SRCCOPY);
-
-
- SelectObject(hMemDC,hOldBitmap);
- DeleteDC(hMemDC);
- }
-
- pCurrent = pCurrent->m_pNextImage;
-
- }
-
- }
-
- void Image::CreateRegion(short ID, short signal, short AllowDrag)
- {
- Image * pCurrent = this;
-
- while (pCurrent->m_ImageID != ID && pCurrent->m_pNextImage != NULL)
- {
- pCurrent = pCurrent->m_pNextImage;
- }
-
- if (pCurrent->m_ImageID == ID)
- {
- pCurrent->m_Signal = signal;
- pCurrent->m_Region = CreateRectRgn(pCurrent->m_Xpos,pCurrent->m_Ypos,
-
- pCurrent->m_Xpos + pCurrent->m_bm.bmWidth, pCurrent->m_Ypos + pCurrent->m_bm.bmHeight);
-
- pCurrent->m_bAllowDrag = AllowDrag;
-
- }
- }
-
- void Image::EvalRegion(CPoint point)
- {
- Image * pCurrent = this;
- int signal = 0;
-
- do
- {
- if (pCurrent->m_bShow && PtInRegion(pCurrent->m_Region,point.x,point.y))
- {
- signal = pCurrent->m_Signal;
-
- }
-
- pCurrent = pCurrent->m_pNextImage;
-
- } while (pCurrent != NULL);
-
- if (signal)
- {
- Signal(signal);
- }
-
-
- }
-
-
- void Image::EvalRegionForDrag(CPoint point, BOOL bStartDrag)
- {
- Image * pCurrent = this;
- int signal = 0;
-
- do
- {
- if (pCurrent->m_bShow && pCurrent->m_bAllowDrag && PtInRegion(pCurrent->m_Region,point.x,point.y))
- {
- pCurrent->SetDragging(bStartDrag);
-
- }
-
- pCurrent = pCurrent->m_pNextImage;
-
- } while (pCurrent != NULL);
-
- }
-
- void Image::SetDragging(BOOL bDragging)
- {
- m_bDragging = bDragging;
- }
-
-
- void Image::SetDraggingToMouse(CPoint point)
- {
- Image * pCurrent = this;
- int signal = 0;
-
- do
- {
- if (pCurrent->m_bShow && pCurrent->m_bDragging)
- {
- pCurrent->m_Xpos = (short)point.x;
- pCurrent->m_Ypos = (short)point.y;
- CreateRegion(pCurrent->m_ImageID,pCurrent->m_Signal,pCurrent->m_bAllowDrag);
- RefreshScreen();
-
- }
-
- pCurrent = pCurrent->m_pNextImage;
-
- } while (pCurrent != NULL);
-
-
-
-
- }
-